"""
案例：演示字符串与二进制数据相互转换

背景：
    在网络编程中，客户端与服务器端进行数据交互，都是采用二进制的形式实现的。

格式：
    编码：字段串.encode(encoding='码表名')           # 字符串 =》二进制
    解码：二进制字符串.decode(encoding='码表名')      # 二进制 =》字符串

注意点：
    1：编解码时，采用的码表名要一致，否则可能出现：乱码的问题。
    2：数字、英文字母、特殊符号，无论在什么码表中，都只占一个字节
        中文在GBK码表（国内常用）占2个字节，在utf-8（万国码，统一码）码表中占3个字节。
"""
# 需求1：演示编码，中文
s1 = "黑马程序员"

# 不写码表，默认使用的是utf-8码表
bs1 = s1.encode()           # byte, 多个字节， b'\xe9\xbb\x91\xe9\xa9\xac\xe7\xa8\x8b\xe5\xba\x8f\xe5\x91\x98'
bs2 = s1.encode(encoding="gbk")
bs3 = s1.encode(encoding="utf-8")

print(bs1)  # b'\xe9\xbb\x91\xe9\xa9\xac\xe7\xa8\x8b\xe5\xba\x8f\xe5\x91\x98'
print(bs2)  # b'\xba\xda\xc2\xed\xb3\xcc\xd0\xf2\xd4\xb1'
print(bs3)  # b'\xe9\xbb\x91\xe9\xa9\xac\xe7\xa8\x8b\xe5\xba\x8f\xe5\x91\x98'

print(type(bs1))
print(type(bs2))
print(type(bs3))
print("-"* 50)

# 需求2：演示编码，数字，字母，特殊符号
s2 = "abcd123!#$"
bs4 = s2.encode(encoding="gbk")
bs5 = s2.encode(encoding="utf-8")

print(bs4)  # b'abcd123!#$'
print(bs5)  # b'abcd123!#$'
print(type(bs4)) # <class 'bytes'>
print(type(bs5)) # <class 'bytes'>
print("-"* 50)

# 需求3：演示解码
bs1 = b'\xe9\xbb\x91\xe9\xa9\xac\xe7\xa8\x8b\xe5\xba\x8f\xe5\x91\x98'
bs2 = b'\xba\xda\xc2\xed\xb3\xcc\xd0\xf2\xd4\xb1'
bs3 = b'abcd123!#$'

s1 = bs1.decode(encoding="utf-8")
print(s1)
print(type(s1))

print(bs2.decode("gbk"))